package drds.server.log;

import java.util.HashSet;
import java.util.Set;

/**
 * 通过日志上下文进行日志的控制.为每个用户提交debug模式。关于其他日志框架，则默认使用ERROR模式。
 * 
 * @author 曹正辉<330937205@qq.com>
 */
public class LogContext {

	/**
	 * 调试信息
	 */
	public static final int DEBUG = 1;
	/**
	 * 普通信息
	 */
	public static final int INFO = 2;
	/**
	 * 提示警告
	 */
	public static final int WARN = 3;
	/**
	 * 系统出现错误
	 */
	public static final int ERROR = 4;

	public static int LOG_LEVEL = ERROR;

	/**
	 * 进行日志动态管控
	 */
	public static boolean MANAGERED = false;
	public static final Set<String> LOG_MANAGERED_PACKAGE_SET = new HashSet<String>();
	public static final Set<String> LOG_MANAGERED_CLASS_SET = new HashSet<String>();

	public static boolean setLogLevel(int logLevel) {
		if (logLevel > ERROR) {
			logLevel = ERROR;
		}
		if (logLevel < DEBUG) {
			logLevel = DEBUG;
		}
		LOG_LEVEL = logLevel;
		return true;
	}

	public static boolean setManager(boolean manager) {
		MANAGERED = manager;
		return true;
	}

	public static final boolean isLogErrorInfo(Class<?> clazz) {

		if (!(LOG_LEVEL >= ERROR)) {
			return false;
		} else {
			if (!MANAGERED) {
				return true;
			} else {
				/**
				 * 进行动态管控控制
				 */
				if (isManagered(clazz)) {
					return true;
				} else {
					return false;
				}

			}

		}
	}

	public static final boolean isLogWarnInfo(Class<?> clazz) {

		if (!(LOG_LEVEL >= WARN)) {
			return false;
		} else {
			if (!MANAGERED) {
				return true;
			} else {
				/**
				 * 进行动态管控控制
				 */
				if (isManagered(clazz)) {
					return true;
				} else {
					return false;
				}

			}

		}

	}

	public static final boolean isLogInfo(Class<?> clazz) {
		if (!(LOG_LEVEL >= INFO)) {
			return false;
		} else {
			if (!MANAGERED) {
				return true;
			} else {
				/**
				 * 进行动态管控控制
				 */
				if (isManagered(clazz)) {
					return true;
				} else {
					return false;
				}

			}

		}
	}

	public static final boolean isLogDebugInfo(Class<?> clazz) {

		if (!(LOG_LEVEL >= DEBUG)) {
			return false;
		} else {
			if (!MANAGERED) {
				return true;
			} else {
				/**
				 * 进行动态管控控制
				 */
				if (isManagered(clazz)) {
					return true;
				} else {
					return false;
				}

			}

		}

	}

	private static boolean isManagered(Class<?> clazz) {
		if (clazz == null) {
			throw new NullPointerException("clazz");
		}
		if (LOG_MANAGERED_CLASS_SET.contains(clazz.getName())) {
			return true;
		}
		for (String packagePath : LOG_MANAGERED_PACKAGE_SET) {
			if (clazz.getPackage().getName().startsWith(packagePath)) {
				return true;
			}
		}
		return false;
	}
}
